/*
 * @Author: wangyuan
 * @Date: 2025-04-11 11:02:49
 * @LastEditors: wangyuan
 * @LastEditTime: 2025-04-11 11:02:50
 * @Description: Echarts Hook，用于封装 Echarts 图表的初始化、更新、调整大小和事件处理逻辑
 * 仅限内部使用
 */
// useEcharts.js
import { ref, onMounted, onUnmounted } from "vue";
import * as echarts from "echarts";
import "echarts-extension-amap";

/**
 * @description Echarts Hook
 * @returns {object} 包含 chartRef, initChart, updateChart, setClickHandler 的对象
 */
export function useEcharts() {
  // 图表容器的引用
  const chartRef = ref(null);
  // Echarts 实例
  let chartInstance = null;
  // 点击事件处理函数
  let clickHandler = null

  /**
   * @description 初始化图表
   * @param {object} option Echarts 配置项
   */
  const initChart = (option) => {
    if (chartRef.value) {
      // 初始化 Echarts 实例
      chartInstance = echarts.init(chartRef.value);
      // 设置图表配置项
      chartInstance.setOption(option);
      // 如果存在点击事件处理函数，则绑定
      if (clickHandler) {
        chartInstance.on('click', clickHandler);
      }
    }
  };

  /**
   * @description 更新图表
   * @param {object} option Echarts 配置项
   */
  const updateChart = (option) => {
    if (chartInstance) {
      // 更新图表配置项
      chartInstance.setOption(option);
    }
  };

  /**
   * @description 调整图表大小
   */
  const resizeChart = () => {
    if (chartInstance) {
      // 调整图表大小以适应容器
      chartInstance.resize();
    }
  };

  /**
   * @description 设置图表点击事件处理函数
   * @param {function} handler 点击事件处理函数
   */
  const setClickHandler = (handler) => {
    clickHandler = handler;
    if (chartInstance) {
      // 移除之前的点击事件监听器，防止重复绑定
      chartInstance.off('click');
      // 绑定新的点击事件监听器
      chartInstance.on('click', clickHandler);
    }
  };

  // 组件挂载时，添加窗口大小变化监听器，用于自动调整图表大小
  onMounted(() => {
    window.addEventListener("resize", resizeChart);
  });

  // 组件卸载时，销毁 Echarts 实例并移除窗口大小变化监听器，释放资源
  onUnmounted(() => {
    if (chartInstance) {
      // 销毁 Echarts 实例
      chartInstance.dispose();
      chartInstance = null;
    }
    // 移除窗口大小变化监听器
    window.removeEventListener("resize", resizeChart);
  });

  // 返回 Hook 提供的接口
  return {
    chartRef, // 图表容器引用
    initChart, // 初始化图表函数
    updateChart, // 更新图表函数
    setClickHandler // 设置点击事件处理函数
  };
}
